package com.briup.cms.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.briup.cms.domain.Category;
import com.briup.cms.exception.ServiceException;
import com.briup.cms.result.ResultCode;
import com.briup.cms.service.CategoryService;
import com.briup.cms.mapper.CategoryMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;
import java.util.Objects;

/**
 *
 */
@Service
public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Category>
    implements CategoryService{

    @Autowired
    CategoryMapper categoryMapper;

    @Override
    public List<Category> getAllParent() {
        LambdaQueryWrapper<Category> lqw = new LambdaQueryWrapper<>();
        lqw.isNull(Category::getParentId);
        return categoryMapper.selectList(lqw);
    }

    @Override
    public void saveCategory(Category category) {
        // 获得栏目名称
        String categoryName = category.getName();
        // 判断是否为空
        if(!StringUtils.hasText(categoryName)){
            log.error("新增栏目时，传入的栏目名称为空");
            throw new ServiceException(ResultCode.DATA_IS_EMPTY);
        }
        // 判读栏目名称是否重复
        if(!checkCategoryName(categoryName)){
            log.error("新增栏目时，栏目名称重复");
            throw new ServiceException(ResultCode.DATA_NOT_UNIQUE);
        }
        // parentId必须有效，个人觉得不用验证
//        Integer parentId = category.getParentId();
//        if(parentId == null){
//            log.error("新增栏目时，传入的parentId为空");
//            throw new ServiceException(ResultCode.DATA_IS_EMPTY);
//        }else {
//            // 根据parentId进行查询，如果不存在就抛异常
//        }
        // order_num 当order_num不存在的时候，自增
        // 存在的时候就用
        Integer orderNum = category.getOrderNum();
        if(orderNum == null){
            // 如何获取当前的最大权重，自己写了个dao计算数据库中最大的orderNum
            Integer maxOrder = categoryMapper.maxOfOrderNum();
            // 如果是第一次，maxOrder是空的，赋值为1
            if(maxOrder == null){
                category.setOrderNum(1);
            }else {
                // 判断最大值是不是10，如果是，只能放10，如果不是，请+1
                if (maxOrder == 10) {
                    category.setOrderNum(10);
                } else if (maxOrder < 10) {
                    category.setOrderNum(maxOrder + 1);
                } else {
                    // 抛个异常
                    log.error("category权重数字不符合要求，请检查！");
                    throw new ServiceException(ResultCode.FAIL);
                }
            }
        }
        save(category);
    }

    @Override
    public Category getByCategoryId(Integer id) {
        return getById(id);
    }

    @Override
    public void modifyCategory(Category category) {

        // 修改栏目名称的话，保证唯一性
        String categoryName = category.getName();
        Integer categoryId = category.getId();
        // 根据id查询category的对象
        Category oldCategory = getByCategoryId(categoryId);
        if(StringUtils.hasText(categoryName)) {
            // 验证和之前的一样不一样
            if(categoryName.equals(oldCategory.getName())){
                log.error("不能修改和之前一样的类别名字");
                throw new ServiceException(ResultCode.FAIL);
            }else {
                // 判读栏目名称是否重复
                if(!checkCategoryName(categoryName)){
                    log.error("新增栏目时，栏目名称重复");
                    throw new ServiceException(ResultCode.DATA_NOT_UNIQUE);
                }
            }
        }

        // 栏目级别不可以修改 => parentId不能由有数据置为null，不能由null变为具体数字

        // 可以更改二级栏目的所属一级栏目
        // 检查原来的parentId是多少
        Integer oldParentId = oldCategory.getParentId();
        // 比对传入的和原来的是否一致，要求传入的和原来的parentId都得有值
        if(oldParentId == null || oldParentId.equals(category.getParentId())){
            category.setParentId(null);
        }
        updateById(category);
    }


    // -------  私有工具 ---

    /**
     * 验证categoryName是否重复
     * @param categoryName 栏目名称
     * @return 是否重复 boolean
     */
    private boolean checkCategoryName(String categoryName){
        // 判读栏目名称是否重复
        LambdaQueryWrapper<Category> lqw = new LambdaQueryWrapper<>();
        lqw.eq(Category::getName,categoryName);
        // c代表根据加入的名字查出来的栏目对象
        Category c = categoryMapper.selectOne(lqw);
        // 如果c不为空，则证明名称不唯一
        if(Objects.nonNull(c)){
            return false;
        }else {
            return true;
        }
    }
}




